<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //1. JSON.parse 将字符串转json对象
        var aa = '{"name":"张三","age":"18"}';
        var aaObj = JSON.parse(aa);
        console.log(aaObj);
        //2. JSON.stringify 将对象转字符串
        var bb = { "name": "张三", "age": "18" };
        var bbStr = JSON.stringify(bb);
        console.log(bbStr);

        //3. eval 可以让字符串进行计算
        console.log(eval('2+3'));

        //4.eval 可以将字符串转json对象
        console.log(eval('(' + aa + ')'));

        //5.JSON.parse和 eval的区别 **
        /*
        1.JSON.parse 将字符串转json对象对字符串进行了格式验证
        2.eval  在将字符串转json对象时，对json格式不会严格验证，  但是性能差
        3.什么时候使用 eval ，当后台给提供的数据不是json的严格模式时，我们使用 eval  ***
        */
        // console.log(JSON.parse('{name:"aa",age:18}'));
        console.log(eval('(' + '{name:"aa",age:18}' + ')'));

        var aaa = [
            {
                bb: [1, 2, 3, 4],
                cc: 'asdfa'
            },
            {
                bb: [1, 2, 3, 4],
                cc: 'asdfa'
            }
        ];
        //浅拷贝,假设有一个对象的属性发生变化时，另一个浅拷贝的对象中该属性也会改变
        // var ccc = aaa;
        // ccc[0].cc = "hi";
        // console.log(ccc);
        // console.log(aaa);

        //深拷贝  ，假设有一个对象的属性发生变化时 ，对另一个拷贝对象不产生任何影响
        var bbbStr = JSON.stringify(aaa);
        var bbb = JSON.parse(bbbStr);

        bbb[0].cc = "hello";
        console.log(aaa);
        console.log(bbb);
        //如果深拷贝中存在函数，不可以使用 序列化和反序列化，可以使用 嵌套循环或递归来实现深拷贝

        //深拷贝在项目中比如：购物车、重组数组经常会用到
    </script>
</body>

</html>